Rails 提供許多功能讓工程師在開發時是相對的簡潔快速,像 Active Record 所提供的對資料庫操作模式,就是一個讓我們方便當隨便,不小心寫入一些地獄code,而 N + 1 即是資料庫效能頭號殺手。
N + 1 問題是什麼呢?
簡易來說,當我們在 view 寫入一個對資料庫發出請求
<% books.each do |book| %>
<%= book.title %>
<%= book.author %>
<% end %>
傳送到 Controller 裡 並寫入所需要方法
class BooksController < ApplicationController
def index
@books = Book.all
end
end
依照 Controller 所需要的方法後對 book model 發出請求
class Book < ApplicationRecord
belongs_to :author
end
但又因為 model 建立的關聯性而必須在從 book model 轉向 author再次發出請求
class Author < ApplicationRecord
end
這就是所謂的 N + 1 問題,就是在我們在對資料庫發出多個條件式在同一件上,而造成資料庫會重複的撈取資料。
因此,在這樣的狀況下,我們可以用
class BooksController < ApplicationController
def index
@books = Book.includes(author)
end
end
今天就聊到這裡吧!期待明天另一個新的開始囉!掰哺!